package Utilidades;

import java.io.*;
/**
 * @brief Clase que se encarga de parsear el documento HTML procedente del PIPE.
 * 		  La clase Petri hace uso de HTML_Parser.
 * 		  En principio, esta clase esta TERMINADA.
 * @author Marcelo
 *
 */
public class HTML_Parser {
	//Campos de la clase HTML_Parser
	private String path;
	private int[][] matriz;
	
	/**
	 * @brief Constructor predeterminado del parser. Requiere le path del archivo a parsear
	 */
	public HTML_Parser(String path){
		this.path = path;
	}
	
	/**
	 * @brief Funcion que lee y parsea un archivo HTML proveniente del PIPE para obtener la matriz de incidencia
	 */
	public void leerHTML(){
		File archivo = new File(path);
		//System.out.println(archivo);
		try{
			InputStream is = new FileInputStream(archivo);
			BufferedReader br = new BufferedReader(new InputStreamReader(is));

		    parsearMatriz(br);
		    
		    br.close();
			br = null;
			is = null;
		}catch(IOException e){e.printStackTrace();}
	}
	
	/**
	 * @brief getter del campo "matriz"
	 * @return
	 */
	public int[][] getMatriz(){
		return matriz;
	}
	
	
	/**
	 * @brief Metodo que posiciona el cursor del BufferedReader a continuacion de una linea que contenga cierto texto dado como parametro
	 * @param lineaBuscada la linea que se busca (o un fragmento de la misma)
	 * @param br es un buffered reader ya abierto que lee un archivo HTML
	 * @return Devuelve la ultima linea leida
	 * @throws IOException
	 */
	private String buscarLinea(String lineaBuscada,BufferedReader br) throws IOException{
		//Avanzo hasta que ya no queden lineas (null) o hasta encontrarme con el comienzo de la matriz que busco
	    boolean listo = false;
	    String nuevaLinea="";
		while (!listo) {
			nuevaLinea = br.readLine();
	    	if(nuevaLinea==null){listo=true;}
	    	if(nuevaLinea.contains(lineaBuscada)){ 
	    		listo=true;
	    		//System.err.println("LO ENCONTREEE!!!");
	    	}
		}
		return nuevaLinea;	
	}
	
	/**
	 * @brief Metodo que devuelve la cantidad de filas de la matriz de incidencia. Debe ejecutarse necesariamente
	 * 		  luego de ejecutar getNumeroDeColumnas.
	 * @param br BufferedReader para leer el html
	 * @return numero de columnas de la matriz de incidencia
	 * @throws IOException
	 */
	private int getNumeroDeFilas(BufferedReader br) throws IOException{
		int cantFilas=0;
		String linea ="";
		while(!linea.contains("cellspacing")||linea==null){
			linea = br.readLine();
			if(linea.contains("rowhead")){cantFilas++;}
		}
		//System.out.println("Cantidad de filas: "+cantFilas);
		return cantFilas;
		
		
	}
	
	
	
	/**
	 * @brief Este metodo cuenta la cantidad de columnas de la matriz de incidencia
	 * @param br BufferedReader para leer el archivo html
	 * @return devuelve la cantidad de columnas de la matriz de incidencia
	 * @throws IOException
	 */
	private int getNumeroDeColumnas(BufferedReader br) throws IOException{
		int cantColumnas=0;
		String linea = buscarLinea("Forwards incidence matrix",br);;
		while(!linea.contains("odd")||linea==null){
			linea = br.readLine();
			if(linea.contains("colhead")){cantColumnas++;}
		}
		//System.out.println("Cantidad de columnas: "+cantColumnas);
		return cantColumnas;
	}
	
	
	
	/**
	 * @brief Funcion que parsea la matriz de incidencia escrita en HTML y la guarda en un arreglo de enteros.
	 * 		  Tambien hace in print de dicha matriz.
	 * @param br
	 * @throws IOException
	 */
	private void parsearMatriz(BufferedReader br) throws IOException{
		int columnas = getNumeroDeColumnas(br);
		int filas = getNumeroDeFilas(br);
		matriz = new int[filas][columnas];
		
		buscarLinea("Combined incidence matrix",br); //Busco donde comienza la matriz
		buscarLinea("rowhead",br);//Busco donde empieza la primera fila
		
		for(int i=0;i<filas;i++){
			for(int j=0;j<columnas;j++){
				buscarLinea("cell",br);
				matriz[i][j]=Integer.parseInt(br.readLine().trim());
				//System.out.print(matriz[i][j]+" ");
			}
			//System.out.print("\n");
		}
	}
	
	
	
}



